package com.wjn.basic.shejimoshi.proxy.Dynamic;

import com.wjn.basic.shejimoshi.proxy.staticproxy.IUserDao;
import com.wjn.basic.shejimoshi.proxy.staticproxy.UserDao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理工厂类，不需要代理类实现目标接口，通过反射动态生成
 */
public class ProxyFactory {

    private Object target;
    public ProxyFactory(Object target){
        this.target=target;
    }

    //给目标对象生成代理对象
    public Object getProxyInstance(){
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("动态代理开始事务");
                        //执行目标对象方法
                        Object returnValue = method.invoke(target, args);
                        System.out.println("动态代理提交事务");
                        return returnValue;
                    }
                }
        );
    }
    /**
     * 测试类
     */

        public static void main(String[] args) {
            // 目标对象
            IUserDao target = new UserDao();
            // 【原始的类型 class cn.itcast.b_dynamic.UserDao】
            System.out.println(target.getClass());

            // 给目标对象，创建代理对象
            IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
            // class $Proxy0   内存中动态生成的代理对象
            System.out.println(proxy.getClass());

            // 执行方法   【代理对象】
            proxy.save();
        }
}
